package cz.pecinovsky.česky.oopnz._134_;
//Příliš žluťoučký kůň úpěl ďábelské ódy

import cz.pecinovsky.česky.oopnz.správce.Kreslítko;
import cz.pecinovsky.česky.oopnz.správce.SprávcePlátna;


import static cz.pecinovsky.česky.oopnz._134_.IOtočný_136_      .IOtočný;
import static cz.pecinovsky.česky.oopnz._134_.IZávod_138_       .IZávod;
import static cz.pecinovsky.česky.oopnz._134_.IZávodník_137_    .IZávodník;
import static cz.pecinovsky.česky.oopnz._134_.Okruh_134_        .Okruh;
import static cz.pecinovsky.česky.oopnz._134_.Šipka_134_        .Šipka;
import static cz.pecinovsky.česky.oopnz._134_.Závod_137_        .Závod;


import static cz.pecinovsky.česky.oopnz._134_.Vozidlo_B_137_    .Vozidlo_B;
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++
//%I+
//import cz.pecinovsky.česky.oopnz.správceplátna.Kreslítko;
//import cz.pecinovsky.česky.oopnz.správceplátna.SprávcePlátna;
//%I-

import cz.pecinovsky.česky.oopnz.utility.Barva;
import cz.pecinovsky.česky.oopnz.utility.Pozice;
import cz.pecinovsky.česky.oopnz.utility.Směr8;
//%X+ xxxxx Začátek přeskakovaného textu xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 */
public class Vozidlo_B_137_
{    private Vozidlo_B_137_() {}   static
////////////////////////////////////////////////////////////////////////////////
//%X- ----- Konec přeskakovaného textu -----


/*******************************************************************************
 * Instance třídy {@code Vozidlo_B} představují
 * "pojízdné", z klávesnice ovladatelné objekty,
 * které je možné přihlásit k závodům.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Vozidlo_B implements IZávodník
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Plátno, na které se bude instance kreslit. */
    private static final SprávcePlátna SP = SprávcePlátna.getInstance();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================

    /** Rychlost pohybu, tj. o kolik bodů se objekt posune po jednom příkazu. */
    private int rychlost = SP.getKrok();



//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Dekorovaný objekt, který bude ovládán z klávesnice. */
    private final IOtočný dekorovaný;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Závod, u nějž se závodník registroval. */
//%I+ <138
//    private Závod závod;
//%I-
//%A+ >138
    private IZávod závod;
//%A-

    /** Pojmenování závodníka, které usnadní jeho identifikaci. */
    private String název;


//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Obalí otočný objekt zadaný v parametru schopností býti ovládán
     * z klávesnice.
     *
     * @param ovládaný Dekorovaný objekt
     */
    public Vozidlo_B(IOtočný ovládaný)
    {
        this.dekorovaný = ovládaný;
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí název instance - implicitně název třídy následovaný ID instance.
     *
     * @return  Řetězec s názvem instance.
     */
    @Override
     public String getNázev()
     {
        return název;
     }


    /***************************************************************************
     * Nastaví nový název instance.
     *
     * @param název  Řetězec s novým názvem instance.
     */
    @Override
    public void setNázev(String název)
    {
        this.název = název;
    }


    /***************************************************************************
     * Vrátí přepravku se souřadnicemi instance.
     *
     * @return  Přepravka se souřadnicemi instance
     */
    @Override
    public Pozice getPozice()
    {
        return dekorovaný.getPozice();
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param pozice  Nová pozice instance
     */
    @Override
    public void setPozice(Pozice pozice)
    {
        dekorovaný.setPozice(pozice);
    }


    /***************************************************************************
     * Nastaví novou pozici instance.
     *
     * @param x   Nová x-ová pozice instance
     * @param y   Nová y-ová pozice instance
     */
    @Override
    public void setPozice(int x, int y)
    {
        dekorovaný.setPozice(x, y);
    }


    /***************************************************************************
     * Vrátí základní délku, od níž se odvozují všechny rozměry objektu.
     *
     * @return Velikost modulu
     */
    @Override
    public int getModul()
    {
        return dekorovaný.getModul();
    }


    /***************************************************************************
     * Nastaví nový základní rozměr objektu,
     * od nějž se odvozují jeho ostatní rozměry.
     *
     * @param modul Nově nastavovaný modul
     */
    @Override
    public void setModul(int modul)
    {
        //Upravíme rychlost, aby byl zachován její poměr vůči modulu
        rychlost = rychlost * modul / dekorovaný.getModul();
        if (rychlost == 0) {
            rychlost = 1;
        }
        dekorovaný.setModul(modul);
    }


    /***************************************************************************
     * Vrátí směr, do nějž je instance natočena.
     *
     * @return Směr, do nějž je instance natočena
     */
    @Override
    public Směr8 getSměr()
    {
        return dekorovaný.getSměr();
    }


    /***************************************************************************
     * Natočí instanci do nového směru.
     *
     * @param směr Směr, do nějž chceme instanci natočit
     */
    @Override
    public void setSměr(Směr8 směr)
    {
        dekorovaný.setSměr(směr);
    }



//%X+
    @Override public int getX() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override public int getY() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
//%X-
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Metoda oznámí závodníku registraci na závodě obdrženém v parametru.
     * Tomuto závodu pak bude hlásit jednotlivé dosažené pozice.
     *
     * @param závod Závod, u nějž je závodník registrován
     */
    @Override
//%I+ <138
//    public void registrujSePro(Závod závod)
//%I-
//%A+ >138
    public void registrujSePro(IZávod závod)
//%A-
    {
        this.závod = závod;
        závod.registrace(this);
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vpravo.
     */
    @Override
    public void vpravo()
    {
        Směr8 směr = dekorovaný.getSměr();
        dekorovaný.setSměr(směr.vpravoVbok());
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vlevo.
     */
    @Override
    public void vlevo()
    {
        Směr8 směr = dekorovaný.getSměr();
        dekorovaný.setSměr(směr.vlevoVbok());
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou vzhůru.
     */
    @Override
    public void vzhůru()
    {
        popojeď(rychlost);
    }


    /***************************************************************************
     * Reakce na stisk klávesy se šipkou dolů.
     */
    @Override
    public void dolů()
    {
        popojeď(-rychlost);
    }


    /***************************************************************************
     * Reakce na stisk klávesy enter.
     */
    @Override
    public void enter()
    {
    }


    /***************************************************************************
     * Reakce na stisk mezerníku.
     */
    @Override
    public void mezera()
    {
    }


    /***************************************************************************
     * Reakce na stisk klávesy ESC, tj. na ukončení ovládání z klávesnice.
     */
    @Override
    public void konec()
    {
    }


    /***************************************************************************
     * Prostřednictvím dodaného kreslítka vykreslí obraz své instance.
     *
     * @param kreslítko Kreslítko, které nakreslí instanci
     */
    @Override
    public void nakresli(Kreslítko kreslítko)
    {
        dekorovaný.nakresli(kreslítko);
    }


    /***************************************************************************
     * Vrátí řetězec sloužící jako textový "podpis" instance
     * používaný především při ladění.
     */
    @Override
    public String toString()
    {
        return "Vozidlo_B_(" + dekorovaný.toString() + ")";
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přesune vozidlo o zadanou vzdálenost směrem, kterým je natočeno;
     * je-li vzdálenost záporná, tak směrem opačným.
     * Přitom kontroluje, jestli vozidlo po přesunu neopustí plátno.
     * Pokud by je opustilo,nepřesune jej.
     *
     * @param vzdálenost Vzdálenost, o kterou se má vozidlo posunout
     */
    private void popojeď(int vzdálenost)
    {
        Pozice pozice = dekorovaný.getPozice();
        Směr8 směr = dekorovaný.getSměr();
        pozice = směr.dalšíPozice(pozice, vzdálenost);
        if ((pozice.x < 0)  ||  (pozice.x >= SP.getBšířka())  ||
            (pozice.y < 0)  ||  (pozice.y >= SP.getBVýška())  )
        {
            return;         //==========>
        }
        dekorovaný.setPozice(pozice);
        závod.průjezdníKontrola(this);
    }



//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        Šipka šipka  = new Šipka();
        Vozidlo_B vb = new Vozidlo_B(šipka);
        Závod  závod = new Závod(Okruh.elko(new Pozice(0,0), Barva.HNĚDÁ));
//                                  Okruh.čtverec(new Pozice(50,50)));
        vb.setNázev("První");
        vb.registrujSePro(závod);
    }

//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}

//%%-  ----- Začátek ignorovaného závěrečného textu -----
////////////////////////////////////////////////////////////////////////////////
//== TESTY A METODA MAIN =======================================================

    /***************************************************************************
     * Testovací metoda.
     */
    public static void test()
    {
        Vozidlo_B.test();
    }
    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )  {  test();  }
}
